package com.yuw.hw20190409.exceptiondemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class TestDriver01 {

	public static void main(String[] args) {
		
		test03();
		
	}

	/**
	 * 先了解：
	 * 异常的分类：非运行时异常（检查性异常、编译时异常） 必须进行显式的异常处理才可以通过编译
	 */
	private static void test032() {
		// jdk7+ 支持 ram（自动资源管理）
		try (FileInputStream is = new FileInputStream("d:/temp/tt.txt");){
			 // 此处发生异常，腿直接跳到catch部分，try后面的代码不会再被执行
			Class.forName("");// 发生 ClassNotFoundException
			System.out.println("执行了try部分");
		} catch (ClassNotFoundException | IOException e) { 
			// 课堂疑问：为什么需要捕获的是IOException而不是FileNotFoundException？
			// 参考网络资源:https://www.oschina.net/question/12_10706
			// 因为自动资源管理时需要调用AutoCloseable接口中的close方法，该方法throws出了IOException，所有使用自动资源管理时需要处理IOException异常；
			System.out.println("执行了catch部分");
			e.printStackTrace();
		} finally {
			System.out.println("执行了finally部分");
			
		}
	}
	
	/**
	 * 异常的分类：非运行时异常（检查性异常、编译时异常） 必须进行显式的异常处理才可以通过编译
	 */
	private static void test0311() {
		FileInputStream is = null;
		try {
			is = new FileInputStream("d:/temp/tt.txt"); // 此处发生异常，腿直接跳到catch部分，try后面的代码不会再被执行
			Class.forName("");// 发生 ClassNotFoundException
			System.out.println("执行了try部分");
		} catch (FileNotFoundException|ClassNotFoundException e) {
			System.out.println("执行了catch部分");
			e.printStackTrace();
		} finally {
			System.out.println("执行了finally部分");
			// 关闭资源
			try {
				is.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 异常的分类：非运行时异常（检查性异常、编译时异常） 必须进行显式的异常处理才可以通过编译
	 */
	private static void test031() {
		
		try {
			FileInputStream is = new FileInputStream("d:/temp/tt.txt"); // 此处发生异常，腿直接跳到catch部分，try后面的代码不会再被执行
			Class.forName("");// 发生 ClassNotFoundException
			System.out.println("执行了try部分");
		} catch (FileNotFoundException|ClassNotFoundException e) {
			System.out.println("执行了catch部分");
			e.printStackTrace();
		} finally {
			System.out.println("执行了finally部分");
			
		}
	}
	
	
	/**
	 * 练习题答案：不适用String类的自带方法，统计字符串的长度
	 */
	private static void test00() {
		String str = "jdfljalksjflkweef";
		// 字符创长度
		int count = 0;

		// try-catch主要是为了保证程序正常执行，显式处理了非检查性异常（运行时异常）
		try {
			// 这是运行时异常，一般不需要进行显式处理
			while (str.charAt(count++) != '\0')
				;
		} catch (Exception e) {
			// 发生异常时的count的值就是字符串的长度
		}

		System.out.println("字符串的长度为：" + (count - 1));
		System.out.println("字符串的长度为：" + str.length());
	}

	/**
	 * 异常的分类：非运行时异常（检查性异常、编译时异常） 必须进行显式的异常处理才可以通过编译
	 */
	private static void test03() {
		try {
			FileInputStream is = new FileInputStream("d:/temp/tt.txt"); // 此处发生异常，腿直接跳到catch部分，try后面的代码不会再被执行
			System.out.println("执行了try部分");
		} catch (FileNotFoundException e) {
			System.out.println("执行了catch部分");
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			System.out.println("执行了finally部分");
		}
	}

	/**
	 * 异常的分类：非运行时异常（检查性异常、编译时异常） 必须进行显式的异常处理才可以通过编译
	 */
	private static void test02() {
		try {
			FileInputStream is = new FileInputStream("d:/temp/tt.txt");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 异常的分类：运行时异常（非检查性异常） 不需要进行显示的异常处理
	 */
	private static void test01() {
		int[] arr = new int[3];
		for (int i = 0; i < arr.length; i++) {
			System.out.println("  " + arr[i]);
		}
	}
}
